package com.atguigu.tingshu.search.listener;

import com.atguigu.tingshu.search.service.ItemService;
import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;


/**
 * @Author GQS @Date 2024/11/5/18:47 @Description
 * 监听专辑的上下架消息同步数据到es中去
 */
@Component
@Log4j2
public class AlbumInfoMessageListener {

  @Autowired
  private ItemService itemService;

  @Autowired
  private RedisTemplate redisTemplate;
  /**
   * 上架消息监听
   * @param channel
   * @param message
   */
  @RabbitListener(queues = "album_info_upper_queue")
  public void albumInfoMessageListenerUpper(Channel channel, Message message){
    //上架处理
    updateAlbumInfoInEs(channel, message, "1");
  }


  /**
   * 下架消息监听
   * @param channel
   * @param message
   */
  @RabbitListener(queues = "album_info_down_queue")
  public void albumInfoMessageListenerDown(Channel channel, Message message){
    //下架处理
    updateAlbumInfoInEs(channel, message, "0");
  }


  /**
   * 专辑上下架处理
   * @param channel
   * @param message
   * @param status
   */
  @SneakyThrows
  private void updateAlbumInfoInEs(Channel channel, Message message, String status) {
    // 获取消息的内容 albumId
    Long albumId = Long.valueOf(new String(message.getBody()));
    // 获取消息的属性
    MessageProperties messageProperties = message.getMessageProperties();
    // 从属性中获取消息的编号
    long deliveryTag = messageProperties.getDeliveryTag();
    try {
      // 执行相应的操作
      if (status.equals("1")){
        // 上架
        itemService.albumInfoFromMysqlToEs(albumId);
      } else {
        // 下架
        itemService.removeAlbumInfoFromEs(albumId);
      }
      // 完成操作后 确认消息
      channel.basicAck(deliveryTag, false);
    } catch (Exception e) {
      if (messageProperties.getRedelivered()){
        // 第二次确认消息失败 记录到redis 并丢弃消息
        redisTemplate.opsForSet().add("search_upper_or_down", albumId.toString()); // 小key用字符串存储
      } else {
        // 第一次确认消息失败后 将消息拒绝 并放回队列
        channel.basicReject(deliveryTag, true);
      }
    }
  }
}
